/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import entidades.CicloNewlong;
import entidades.EstadoTrabajo;
import entidades.Newlong;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ControlDeCiclosNewlong {

    private List<Newlong> newlongs;
    
    public ControlDeCiclosNewlong() throws SQLException{
        newlongs = Newlong.listar();
    }
    
    public void cerrarCiclos() throws SQLException{
        for (Newlong n : newlongs){
            cerrarCiclosDeNewlong(n);
        }
    }
    
    public void recalcularAcarreoDeCiclos() throws SQLException{
        /*
         * Calculo de acarreo para cada newlong
         */
        Map<Newlong, Integer> acarreosPorNewlong = new HashMap<Newlong, Integer>();
        for (Newlong n : newlongs) {
            resetearAcarreo(n);
            acarreosPorNewlong.put(n, acarreo(n));
        }

        /*
         * Distribucion de acarreo
         */
        for (Newlong n : newlongs) {
            distribuirAcarreoPorNewlong(n, acarreosPorNewlong.get(n));
        }
    }
    
     private Integer acarreo(Newlong n) throws SQLException{
        Integer suma = 0;
        ResultSet result = MySQL.executeQuery(
                "select sum(wo.cantidad) as acarreo "+
                "from ordenes_trabajo wo, ciclos_newlong cn "+
                "where cn.id = wo.ciclo_newlong_id "+
                "and cn.cerrado = 1 "+
                "and cn.newlong_id = "+n.getId()+" "+
                "and wo.estado_id <> "+EstadoTrabajo.CONFECCIONADO
                );
		if(result.next()) {
                    suma = result.getInt("acarreo");
                }
		result.getStatement().close();
	return suma;
    }
    
    private void cerrarCiclosDeNewlong(Newlong newlong) throws SQLException{
        for(CicloNewlong cn : CicloNewlong.getCicloNewlongByNewlong(newlong.getId())){
            if(cn.getFechaHoraFin().before(new Date())){
                cn.setCerrado(true);
            }
            cn.guardar();
        }
    }

    private void resetearAcarreo(Newlong newlong) throws SQLException{
        for(CicloNewlong cn : CicloNewlong.getCicloNewlongByNewlong(newlong.getId())){
            cn.setAcarreo(0);
            cn.guardar();
        }
    }
    
     private void distribuirAcarreoPorNewlong(Newlong newlong, Integer acarreo){
            try {
                /*Los ciclos se listan en forma ascendente por fecha de inicio*/
                List<CicloNewlong> ciclos = CicloNewlong.getCicloNewlongByNewlongFromToday(newlong.getId());
                
                Integer i = 0;
                for( ; i < ciclos.size() && acarreo > 0; i++){
                    
                    CicloNewlong ciclo = ciclos.get(i);
                    
                    if(!ciclo.isCerrado()){
                        Long disponible = ciclo.getDisponible();
                        Long acarreoParaCiclo = (disponible<0)?0:((disponible >= acarreo)? acarreo : disponible);

                        /*distribuyo el acarreo en el ciclo*/
                        ciclo.setAcarreo(acarreoParaCiclo);
                        ciclo.guardar();

                        /*descuento al acarreo total lo acarreado por el ciclo*/
                        acarreo -= acarreoParaCiclo.intValue();
                    }
                }
            } catch (SQLException ex) {
//                Logger.getLogger(TimerActualizarCapCiclo.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
}
